Conversation
|
CI должен проходить успешно для допуска к проверке. |
|
|
||
| // open database file. check if not null. | ||
| int open_car_database(FILE** db_ptr, const char* basename) { | ||
| *db_ptr = fopen(basename, "r+"); |
There was a problem hiding this comment.
Если в db_ptr прилетит NULL, программа упадет. Это относится и к другим функциям, везде нужно проверять валидность переданных указателей.
project/src/main.c
Outdated
| return_code = ALLOCATE_ERROR; | ||
| } | ||
| if (return_code !=0) | ||
| break; |
There was a problem hiding this comment.
Большое количество break, постарайся соблюдать правила структурного программирования и делать код более линейным.
| car* input_car = (car*)malloc(sizeof(car)); | ||
| car* found_car = (car*)malloc(sizeof(car)); | ||
|
|
||
| FILE* db = NULL, * search = NULL; |
There was a problem hiding this comment.
Вкусовщина, но лучше не объявлять переменные одного типа в строку, делает код менее читаемым
project/src/cars.c
Outdated
| return 0; | ||
| } | ||
|
|
||
| int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { |
There was a problem hiding this comment.
Мне кажется, buffer_value лучше передать так: const char buffer_value*
project/src/cars.c
Outdated
| int error_out(int err_code) { | ||
| switch (err_code) { | ||
| case 1: | ||
| printf("%s", "NULL POINTER!"); |
There was a problem hiding this comment.
Ошибки лучше писать в поток ошибок
project/tests/cars.cpp
Outdated
|
|
||
| TEST(open_car_database, ok) { | ||
| FILE* pointer; | ||
| EXPECT_EQ(open_car_database(&pointer, "../../db.txt"), 0); |
There was a problem hiding this comment.
Плохо, что тесты зависят от внешних файлов, не создаваемых в тестах
project/src/cars.c
Outdated
| return INCORRECT_ENTRY; | ||
| } | ||
| } | ||
| if (strtof(read_buffer[0], NULL) > 0 && strtof(read_buffer[1], NULL) > 0 |
There was a problem hiding this comment.
Лучше сложить результат работы функции в переменные, чтоб не делать лишнюю работу
project/CMakeLists.txt
Outdated
| file(GLOB sources | ||
| "${PROJECT_SOURCE_DIR}/include/*.h" | ||
| "${PROJECT_SOURCE_DIR}/src/*.c") |
There was a problem hiding this comment.
Стоит явно указывать все единицы трансляции (*.c) для исполняемого файла, хидера указывать не нужно
| @@ -0,0 +1,23 @@ | |||
| cmake_minimum_required(VERSION 3.15) | |||
There was a problem hiding this comment.
Нет продуктовой цели, только тестовая.
project/include/cars.h
Outdated
| #include <stdio.h> | ||
| #include <stdlib.h> |
There was a problem hiding this comment.
Хидера стоит располагать в начале файла.
project/src/cars.c
Outdated
| return 0; | ||
| } | ||
|
|
||
| int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]) { |
There was a problem hiding this comment.
Судя по реализации задача метода скопировать строку в другую память. Название метода не соответствует назначению.
Рассмотри
https://man7.org/linux/man-pages/man3/strdup.3.html#:~:text=The%20strdup()%20function%20returns,copies%20at%20most%20n%20bytes.
Либо создай свой аналог с аналогичной сигнатурй char *strdup(const char *s);
| int open_car_database(FILE** db_ptr, const char* basename); | ||
| int read_car_instance(FILE* db_ptr, car *car_read); | ||
| int print_car_instance(const car* car_print); | ||
| float comparison(const car* car_1, const car* car_2); | ||
| int free_car(car* car_1); | ||
| int copy_car(car* dest, car* src); | ||
| int search_in_base(car* input_car, car* found_car, FILE* db); | ||
|
|
||
| int allocate_string(char** string_in_car, const char buffer_value[SIZE_BUF]); | ||
| int min_of_3(int i, int i1, int i2); | ||
| int car_nullptr(car* car_1); | ||
| float string_distance(const char* a, const char* b); | ||
| float distance_fl(float a, float b); | ||
| int error_out(int err_code); |
There was a problem hiding this comment.
В .h стоит выносит только те методы, который нужны вызывающей программе для работы с машинами, остальные методы стоит держать только в .c. Принципы инкапсуляции применимы и к с.
project/src/cars.c
Outdated
| int car_nullptr(car* car_1) { | ||
| car_1->body_type = NULL; | ||
| car_1->model_name = NULL; | ||
| return 0; | ||
| } |
There was a problem hiding this comment.
Не нужен, занулять память можно при создании объекта, например через calloc, или явно memset после malloc
project/src/main.c
Outdated
| // open fault check | ||
| if (open_car_database(&db, argv[1]) != 0 || | ||
| open_car_database(&search, argv[2]) != 0) { | ||
| return_code = ALLOCATE_ERROR; |
project/src/main.c
Outdated
| break; | ||
|
|
||
| // write to file for search | ||
| char read_buffer[SIZE_BUF]; |
project/src/main.c
Outdated
|
|
||
| // write to file for search | ||
| char read_buffer[SIZE_BUF]; | ||
| for (int i = 0; i < 5; i++) { |
There was a problem hiding this comment.
Что такое 5? Введи константу или дефайн
| if (scanf(SCAN_FORMAT , read_buffer) != 1) { | ||
| return_code = INCORRECT_ENTRY; | ||
| } else { | ||
| fputs(read_buffer, search); | ||
| if (i < 4) | ||
| fputs(" ", search); | ||
| } |
project/src/cars.c
Outdated
| for (int i = 0; i < 5; i++) { | ||
| if (fscanf(db_ptr, SCAN_FORMAT, read_buffer[i]) != 1) { | ||
| return INCORRECT_ENTRY; | ||
| } | ||
| } |
There was a problem hiding this comment.
Избавься от литералов в коде, что такое 5?
project/src/cars.c
Outdated
| car_read->engine_power = strtof(read_buffer[0], NULL); | ||
| car_read->maximum_velocity = strtof(read_buffer[1], NULL); | ||
| car_read->fuel_consumption = strtof(read_buffer[2], NULL); |
There was a problem hiding this comment.
Если в каждом индексе лежит конкретная характеристика, то индексам лучше дать имена
| float string_distance(const char* a, const char* b) { | ||
| size_t x = 0, y = 0, len_a = strlen(a), len_b = strlen(b); | ||
| int matrix[SIZE_BUF + 1][SIZE_BUF + 1]; |
There was a problem hiding this comment.
Что если залетит null?
project/src/cars.c
Outdated
| case 1: | ||
| fprintf(stderr, "%s", "NULL POINTER!\n"); | ||
| return 1; | ||
| case 2: | ||
| fprintf(stderr, "%s", "INCORRECT INPUT\n"); | ||
| return 2; | ||
| case 3: | ||
| fprintf(stderr, "%s", "ALLOCATION FAULT\n"); | ||
| return 3; | ||
| case 4: | ||
| fprintf(stderr, "%s", "INCORRECT OUTPUT\n"); | ||
| return 4; |
There was a problem hiding this comment.
Ошибкам нужно дать имена
project/src/main.c
Outdated
| // Copyright 2021 <BKZ> | ||
| #include <stdio.h> | ||
| #include <stdbool.h> | ||
| #include "../include/cars.h" |
There was a problem hiding this comment.
Такого пути быть не должно, подключи директорию в cmake через include_directories
project/tests/cars.cpp
Outdated
| TEST(min, ok) { | ||
| ASSERT_EQ(min_of_3(1, 2, 3), 1); | ||
| ASSERT_EQ(min_of_3(1, 3, 2), 1); | ||
| ASSERT_EQ(min_of_3(2, 1, 3), 1); | ||
| ASSERT_EQ(min_of_3(3, 1, 2), 1); | ||
| ASSERT_EQ(min_of_3(2, 3, 1), 1); | ||
| ASSERT_EQ(min_of_3(3, 2, 1), 1); | ||
| } | ||
| TEST(Levenstein, ok) { | ||
| EXPECT_EQ(string_distance("Toyota", "Toyota"), 1); | ||
| EXPECT_EQ(string_distance("Toyota", "Toy"), 0.5); | ||
| EXPECT_EQ(string_distance("Toyota", "Renaul"), 0); | ||
| } | ||
| TEST(distance, ok) { | ||
| EXPECT_EQ(distance_fl(1, 2), 0.5); | ||
| EXPECT_EQ(distance_fl(4, 1), 0.25); |
There was a problem hiding this comment.
В названии теста должно быть его описание. первое слово - тестируемая функция(группа тестов), второе - то, что конкретно тест проверяет
|
выкатил фикс |
|
зачет |
1й пул на дз